package com.charonmc.utils.mysql;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;


/**
 * InsertUtils是管理插入数据有关的对象
 * @author ChuYang
 */

public class InsertUtils extends SqlManager{
    private int sqlRowCount;
    private ArrayList<Object> params = new ArrayList<>();

    /**
     * 创建对象
     * @param connection SQLManager传入连接
     */
    public InsertUtils(Connection connection){
        this.connection = connection;
    }

    /**
     * 指定数据表
     * @param table 所要操作的数据表
     * @return {@link InsertUtils}
     */
    public InsertUtils inTable(String table){
        this.sql.append(table)
                .append(" ");
        return this;
    }

    /**
     * 创建插入索引名
     * @param columns 索引名
     * @return {@link InsertUtils}
     */
    public InsertUtils addColumnNames(String[] columns){
        this.sql.append("(");
        for (int i = 0; i < columns.length - 1; i++) {
            this.sql.append(columns[i])
                    .append(",");
        }
        this.sql.append(columns[columns.length - 1])
                .append(")")
                .append("VALUES")
                .append("(");
        for (int i = 0; i < columns.length - 1; i++) {
            this.sql.append("?")
                    .append(",");
        }
        this.sql.append("?)");
        return this;
    }

    /**
     * 创建插入索引值
     * @param Params 索引值
     * @return {@link InsertUtils}
     */
    public InsertUtils addParams(Object[] Params){
        params.addAll(Arrays.asList(Params));
        return this;
    }

    /**
     * 构建sql语句
     * @return {@link InsertUtils}
     * @throws SQLException 数据库异常
     */
    public InsertUtils build() throws SQLException {
        this.ps = connection.prepareStatement(this.sql.toString(), Statement.RETURN_GENERATED_KEYS);
        for (int i = 0; i < params.size(); i++) {
            ps.setObject(i + 1, params.get(i));
        }
        return this;
    }

    /**
     * 执行sql语句
     * @return {@link InsertUtils}
     * @throws SQLException 数据库异常
     */
    public InsertUtils execute() throws SQLException {
        this.sqlRowCount = ps.executeUpdate();
        return this;
    }

    /**
     * 获得受影响的行数
     * @return 受影响的行数
     */
    public int getResult(){
        return this.sqlRowCount;
    }

    /**
     * 获取自增主键的值
     * @return 自增主键值
     */
    public int getGeneratedKey() throws SQLException {
        ResultSet set = ps.getGeneratedKeys();
        set.next();
        return set.getInt(1);
    }
}
